package foot.modele;

import java.util.Collection;
import java.util.HashSet;

import javax.persistence.CascadeType;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.ManyToOne;
import javax.persistence.OneToMany;
import javax.persistence.OneToOne;

@Entity
public class Match {
	private int id;
	private Equipe equipe1;
	private Equipe equipe2;
	private Arbitre arbitre;
	private Collection<But> lesButs;
	private String statusMatch;
	private boolean estTermine;
	//TODO voir si on prend que des booléens
	private boolean prolongation;
	private boolean tirsAuButs;
	private Match pred1;
	private Match pred2;

	public Match(){
		lesButs = new HashSet<>();
	}

	@Id
	@GeneratedValue
	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
	@OneToOne
	public Equipe getEquipe1() {
		return equipe1;
	}
	public void setEquipe1(Equipe equipe1) {
		this.equipe1 = equipe1;
	}
	@OneToOne
	public Equipe getEquipe2() {
		return equipe2;
	}
	public void setEquipe2(Equipe equipe2) {
		this.equipe2 = equipe2;
	}

	@ManyToOne
	public Arbitre getArbitre() {
		return arbitre;
	}
	public void setArbitre(Arbitre arbitre) {
		this.arbitre = arbitre;
	}

	@OneToMany(mappedBy = "match",cascade={CascadeType.ALL})
	public Collection<But> getLesButs() {
		return lesButs;
	}


	public void setLesButs(Collection<But> lesButs) {
		this.lesButs = lesButs;
	}
	public String getStatusMatch() {
		return statusMatch;
	}
	public void setStatusMatch(String statusMatch) {
		this.statusMatch = statusMatch;
	}
	public boolean isEstTermine() {
		return estTermine;
	}
	public void setEstTermine(boolean estTermine) {
		this.estTermine = estTermine;
	}
	//TODO a dégager
	public boolean prolongation()
	{
		//TODO
		return false;
	}
	//TODO a dégager
	public boolean TirsAuButs()
	{
		//TODO
		return false;

	}

	public boolean isProlongation() {
		return prolongation;
	}

	public void setProlongation(boolean prolongation) {
		this.prolongation = prolongation;
	}

	public boolean isTirsAuButs() {
		return tirsAuButs;
	}

	public void setTirsAuButs(boolean tirsAuButs) {
		this.tirsAuButs = tirsAuButs;
	}

	@Override
	public int hashCode() {
		return id;
	}

	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		Match other = (Match) obj;
		if (arbitre == null) {
			if (other.arbitre != null)
				return false;
		} else if (!arbitre.equals(other.arbitre))
			return false;
		if (equipe1 == null) {
			if (other.equipe1 != null)
				return false;
		} else if (!equipe1.equals(other.equipe1))
			return false;
		if (equipe2 == null) {
			if (other.equipe2 != null)
				return false;
		} else if (!equipe2.equals(other.equipe2))
			return false;
		if (estTermine != other.estTermine)
			return false;
		if (id != other.id)
			return false;
		if (lesButs == null) {
			if (other.lesButs != null)
				return false;
		} else if (!lesButs.equals(other.lesButs))
			return false;
		if (prolongation != other.prolongation)
			return false;
		if (statusMatch == null) {
			if (other.statusMatch != null)
				return false;
		} else if (!statusMatch.equals(other.statusMatch))
			return false;
		if (tirsAuButs != other.tirsAuButs)
			return false;
		return true;
	}

	public String score(){
		int score_equipe1 = 0;
		int tab_equipe1 = 0;
		int score_equipe2 = 0;
		int tab_equipe2 = 0;
		for (But but : lesButs) {
			if(but.getAuteur().getEquipe().equals(equipe1)) {
				if(but.isTir_au_but())
					tab_equipe1++;
				else
					score_equipe1++;
			} else {
				if(but.isTir_au_but())
					tab_equipe2++;
				else
					score_equipe2++;
			}
		}
		if(tirsAuButs)
			return score_equipe1 + "-" + score_equipe2 + "(" + tab_equipe1 + "-" + tab_equipe2 + ")";
		else
			return score_equipe1 + "-" + score_equipe2;
	}

	public Equipe vainqueur(){
		int score_equipe1 = 0;
		int score_equipe2 = 0;
		for (But but : lesButs) {
			if(but.getAuteur().getEquipe().equals(equipe1))
				score_equipe1++;
			else
				score_equipe2++;
		}
		if(score_equipe1 > score_equipe2)
			return equipe1;
		else if(score_equipe1 == score_equipe2)
			return null;
		else
			return equipe2;
	}

	@OneToOne
	public Match getPred1() {
		return pred1;
	}

	public void setPred1(Match pred1) {
		this.pred1 = pred1;
	}

	@OneToOne
	public Match getPred2() {
		return pred2;
	}

	public void setPred2(Match pred2) {
		this.pred2 = pred2;
	}

}
